#pragma once
#include <string>
#include <iostream>
#include <functional>
#include "Inetaddr.hpp"

// 对于每一个连接的封装，并且是基类，未来我们可能会有对于listen的连接，以及对于正常读写Io的连接


class Reactor;

//这是IoService的处理方法，我懒得定义两遍了，直接定义在这。
using handler_t = std::function<std::string(std::string&)>;

class Connection
{
protected:
    // 一个连接需要什么属性呢?
    /*
    1. 文件描述符
    2. 各自的读写缓冲区 (因为我们要解决读写不完善的问题)
    3. 文件描述符关心的事件
    4. 执行Reactor对象的指针
    5. 读/写/异常 等处理的方法
    */
    int _fd;
    uint32_t _event;
    std::string _rbuffer;
    std::string _obuffer;
    Reactor *_self_ptr;
    InetAddr _peer; // 对端连接的属性
public:
    virtual void Reader() {}
    virtual void Sender(std::string& out) {}
    virtual void Exceptor() {}
    Connection()
    {
    }
    // 这里不把这两个作为构造，不然每一次子类构造还要去调用基类的构造函数
    void SetFd(int fd) { _fd = fd; }
    void SetOnwer(Reactor *self) { _self_ptr = self; }
    void SetEvent(uint32_t event) { _event = event; }
    void AppendReadBuffer(const std::string& in){
        _rbuffer += in;
    }
    void AppendOutBuffer(const std::string& in )
    {
        _obuffer += in;
    }
    void DisCard(int n)
    {
        _obuffer.erase(0,n);
    }
    std::string& GetInBuffer() {
        return _rbuffer;
    }
    std::string& GetOuBuffer() {
        return _obuffer;
    }
    bool IsOutBufferEmpty() {return _obuffer.empty();}
    Reactor *GetOwner() { return _self_ptr; }
    int GetFD() { return _fd; }
    uint32_t GetEvent() { return _event; }
    void Close()
    {
        if (_fd != -1)
            ::close(_fd);
    }
    virtual void RegisterHandler(handler_t handler) {  }    
    virtual ~Connection() {}
};
